package com.optimus.db;
import com.optimus.common.util.ConstantesDB;
import com.optimus.common.util.ManejoArchivo;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author victor
 */
public class QueryFactory {

    private static Logger logger = LoggerFactory.getLogger(QueryFactory.class);

    private static QueryFactory i=null;

    private HashMap<String,String> queries= new HashMap<String,String>();

    private boolean estaHabilitado=false;

    public static  QueryFactory instance(){
        return i==null?new  QueryFactory():i;
    }

    private  QueryFactory(){
        load();
        i=this;
    }
    private void load(){
        Object[] logParams = new Object[3];
        try {
            ArrayList<String> listado=ManejoArchivo.getClassNamesFromPackage(ConstantesDB.QUERY_PACKAGE);
            StringBuffer sb = null;
            InputStream is = null;
            logger.debug("Cantidad de archivos:" + (listado==null?0:listado.size()) );
            for (String nombre : listado) {
                sb = new StringBuffer();
                logger.debug("QueryFile: " + nombre);
                is = ManejoArchivo.load(ConstantesDB.QUERY_PACKAGE+ConstantesDB.SEPARATOR_NAME+nombre+".sql");
                InputStreamReader isr = new InputStreamReader(is);
                char[] cbuf = new char[512];
                int cantidad=0;
                while( (cantidad=isr.read(cbuf))>0 ){
                    sb.append(cbuf, 0, cantidad);
                    Arrays.fill(cbuf, (char)0);
                }
                isr.close();
                nombre=nombre.replaceAll(".sql", "");//quitar la extension
                queries.put(nombre.toLowerCase(), sb.toString());
            }
            estaHabilitado=true;
        } catch (Exception e) {
            estaHabilitado=false;
            logParams[2]=e;
        } finally{
            logger.info("sql={} parametros={}", logParams);
        }
    }
    public String query(String clave,Long ticket){
        if(estaHabilitado){
            if (clave==null){
                logger.info("Clave nula: ticket={}",new Object[]{clave,ticket});
                return "";
            }
            String nombre=clave.toLowerCase();
            if(queries.containsKey(nombre)){
                return queries.get(nombre);
            }else{
                logger.info("Query no encontrado para clave={} ticket={}",new Object[]{clave,ticket});
                return "";
            }
        }
        logger.info("El Administrador de queries no esta habilitado ticket={}",new Object[]{ticket});
        return "";
    }
}
